package bingfa

import (
	"fmt"
	"time"
)

//使用select解决从管道取数据的阻塞问题

func Test10()  {
	//1,定义一个管道10个数据int
	intChan:=make(chan int,10)
	for i:=0;i<10;i++{
		intChan<-i
	}
	//2,定义一个管道5个数据string
	stringChan:=make(chan string,5)
	for i:=0;i<5;i++{
		stringChan<-"hello"+fmt.Sprintf("%d",i)
	}
	//传统的方法在遍历管道时，如果不关闭会阻塞而导致deadlock
	/*问题，在实际开发中，我们不好确定什么时候关闭该管道
	因此可以使用select方式来解决
	 */
	for  {
		select {
		/*注意：这里如果intChan一直没有关闭，不会一直阻塞而deadlock，而会自动到下一个case匹配
		 */
			case v:=<-intChan:
				fmt.Println("intchan",v)
				time.Sleep(time.Second)
		    case v:=<-stringChan:
				fmt.Println("stringchan",v)
				time.Sleep(time.Second)
		    default:
				fmt.Println("退出")
				time.Sleep(time.Second)
				break
		}
	}
}
